/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package plp1;

import java.util.ArrayList;

/**
 *
 * @author eltorre
 */
public class TablaSimbolos {

	TablaSimbolos padre = null;
	ArrayList<Simbolo> simbolos = new ArrayList<Simbolo>();
	int nivel = 0;

	public TablaSimbolos() {
		this.padre = null;
	}

	public TablaSimbolos (TablaSimbolos t)
	{
		padre = t.padre;
		simbolos = t.simbolos;
	}

	/**
	 * Retirar un nivel de la tabla de simbolos. Devuelve las variables locales
	 * @return
	 */
	public String pop(String h) {
		String ret = "";

		for (Simbolo s : simbolos)
		{
			if (s.tipoSimbolo == Simbolo.VAR)
			{
				ret += s.ToString(h);
			}
		}
		for (Simbolo s : simbolos)
		{
			if (s.tipoSimbolo == Simbolo.METODO)
			{
				ret += s.ToString(h);
			}
		}


		if (padre != null)
		{
			simbolos = padre.simbolos;
			padre = padre.padre;
			nivel--;
		}
		return ret;
	}

	/**
	 * Añadir un nivel mas a la tabla de simbolos
	 */
	public void push()
	{
		padre = new TablaSimbolos(this);
		simbolos = new ArrayList<Simbolo>();
		nivel++;
	}

	/**
	 * Añadir un simbolo.
	 * @param nombre
	 * @param tipoSimbolo
	 * @param tipo
	 */
	public void nuevoSimbolo(String nombre, Integer tipoSimbolo, Integer tipo) {
		Simbolo s = new Simbolo(nombre, tipoSimbolo, tipo);
		simbolos.add(s);
	}

	public void nuevoSimbolo(String nombreMetodo, String cuerpoMetodo)
	{
		Simbolo s = new Simbolo(nombreMetodo, Simbolo.METODO, cuerpoMetodo);
		simbolos.add(s);
	}
	/**
	 * Devolver un simbolo dado. Si no existe, se busca en el padre. Para buscar usos
	 * @param nombre
	 * @return
	 */
	public Simbolo busca(String nombre) {

		for (Simbolo s: simbolos)
		{
			if (s.nombre.equals(nombre))
			{
				return s;
			}
		}

		// si no lo encuentra, busca en el ámbito exterior
		if (padre != null) {
			return padre.busca(nombre);
		}
		return null; // no se encontró
	}

	/**
	 * Si existe una variable en un ambito. Condicion para insertar
	 * @param nombre
	 * @return
	 */
	public boolean existe(String nombre) {
		for (Simbolo s: simbolos)
		{
			if (s.nombre.equals(nombre))
			{
				return true;
			}
		}
		return false;
	}
}
